From bf0894ac7b66f9d857b10c06051614af1e3b81db Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 27 Jun 2006 09:41:09 +0100 Subject: [PATCH] [HVM][VMX] Safer treatment of VM_EXEC_CONTROL when dealing w/ PENDING_INTERRUPT vmexit. Signed-off-by: George Dunlap --- xen/arch/x86/hvm/vmx/vmx.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index a8dca0dd2b..258837c115 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2148,9 +2148,17 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs regs) vmx_vmexit_do_extint(®s); break; case EXIT_REASON_PENDING_INTERRUPT: + /* + * Not sure exactly what the purpose of this is. The only bits set + * and cleared at this point are CPU_BASED_VIRTUAL_INTR_PENDING. + * (in io.c:{enable,disable}_irq_window(). So presumably we want to + * set it to the original value... + */ + v->arch.hvm_vcpu.u.vmx.exec_control &= ~CPU_BASED_VIRTUAL_INTR_PENDING; + v->arch.hvm_vcpu.u.vmx.exec_control |= + (MONITOR_CPU_BASED_EXEC_CONTROLS & CPU_BASED_VIRTUAL_INTR_PENDING); __vmwrite(CPU_BASED_VM_EXEC_CONTROL, - MONITOR_CPU_BASED_EXEC_CONTROLS); - v->arch.hvm_vcpu.u.vmx.exec_control = MONITOR_CPU_BASED_EXEC_CONTROLS; + v->arch.hvm_vcpu.u.vmx.exec_control); break; case EXIT_REASON_TASK_SWITCH: __hvm_bug(®s); -- 2.30.2